package com.wz.leetcode;

import java.util.HashSet;
import java.util.Set;

public class LongestString {

//-----------------1------------------------------------
//    public int lengthOfLongestSubstring(String s) {
//        Set<Character> chars = new HashSet<>();
//        char[] charArr = s.toCharArray();
//        for (char c : charArr) {
//            chars.add(c);
//        }
//
//        int longestLength = 0;
//        for(int i = 0; i < charArr.length; i ++){
//            int newLength = flushLength(chars, charArr, i);
//            if (newLength > longestLength){
//                longestLength = newLength;
//                if (longestLength == chars.size()){
//                    break;
//                }
//            }
//        }
//        return longestLength;
//    }
//
//    int flushLength(Set<Character> chars, char[] charArr, int index){
//        System.out.println("新刷新:");
//        Set<Character> charsCopy = new HashSet<>();
//        charsCopy.addAll(chars);
//        int length = 0;
//        for(int i = index; i < charArr.length; i ++){
//            if (charsCopy.contains(charArr[i])){
//                System.out.print(charArr[i] + ",");
//                length ++;
//                charsCopy.remove(charArr[i]);
//            } else{
//                System.out.println("遇到重复字符:" + charArr[i]);
//                break;
//            }
//        }
//        System.out.println("");
//        return length;
//    }

//-----------------2------------------------------------
//    public int lengthOfLongestSubstring(String s) {
//        char[] charArr = s.toCharArray();
//        int longestLength = 0;
//
//        for (int i = 0; i < charArr.length; i++) {
//            int newLength = flushLength(charArr, i);
//            if (newLength > longestLength) {
//                longestLength = newLength;
//            }
//            if (newLength == charArr.length - i){
//                break;
//            }
//        }
//        return longestLength;
//    }
//
//    int flushLength(char[] charArr, int index) {
//        System.out.println("新刷新:");
//        MyCharList list = new MyCharList();
//        for (int i = index; i < charArr.length; i++) {
//            if (!list.contain(charArr[i])) {
//                list.addNewChar(charArr[i]);
//                System.out.print(charArr[i] + ",");
//            } else {
//                System.out.println("遇到重复字符:" + charArr[i]);
//                break;
//            }
//        }
//        System.out.println("");
//        return list.size;
//    }
//
//    static class MyCharList {
//        MyChar top;
//        MyChar currentChar;
//        int size;
//
//        public MyCharList() {
//        }
//
//        void addNewChar(Character c) {
//            if (top == null) {
//                currentChar = new MyChar(c);
//                top = currentChar;
//            } else {
//                currentChar.nextChar = new MyChar(c);
//                currentChar = currentChar.nextChar;
//            }
//            size++;
//        }
//
//        boolean contain(Character c) {
//            return hasChar(top, c);
//        }
//
//        boolean hasChar(MyChar myChar, Character c){
//            if (myChar == null){
//                return false;
//            }
//            if (myChar.mychar.equals(c)){
//                return true;
//            }
//            if (myChar.nextChar == null){
//                return false;
//            } else {
//                return hasChar(myChar.nextChar, c);
//            }
//        }
//    }
//
//    static class MyChar {
//        Character mychar;
//        MyChar nextChar;
//
//        public MyChar(Character mychar) {
//            this.mychar = mychar;
//        }
//    }


    public int lengthOfLongestSubstring(String s) {
//        char[] charArr = s.toCharArray();
        return 1;
    }

    boolean[][] getCharBitArrays(String s){
        Set<Character> chars = new HashSet<>();
        char[] charArr = s.toCharArray();
        for (char c : charArr) {
            chars.add(c);
        }
        boolean[][] arr = new boolean[chars.size()][charArr.length];
        Character[] charArray = new Character[chars.size()];
        chars.toArray(charArray);
        for (int i = 0; i < charArray.length; i ++) {
            for (int j = 0 ; j < charArr.length ; j ++) {
                if (charArray[i].equals(charArr[j])){
                    arr[i][j] = true;
                }
            }
        }
        return arr;
    }

    boolean arraySearch(int len, boolean[]... charArrays){
        for (int i = 0 ; i < charArrays[0].length ; i ++) {
            boolean isLongest = isLongest(i, len, charArrays);
            if (isLongest){
                return true;
            }
        }
        return false;
    }

    boolean isLongest(int i, int len, boolean[]... charArrays){
        int newLen = 0;
        boolean[] line = new boolean[len];
        for (int j = i ; j < i + len && j < charArrays[0].length; j ++) {
            for (int h = 0 ; h < len ; h ++) {
                line[h] = charArrays[h][j] ^ line[h];
            }
        }
        boolean result = true;
        for (boolean b : line) {
            result = result & b;
        }
        return result;
    }

    boolean getResult(boolean a, boolean b){
        return a | b;
    }

    public static void main(String[] args) {
        LongestString longestString = new LongestString();
//        boolean[] a = new boolean[]{true, false, false, false, false, false, false, false};
//        boolean[] b = new boolean[]{false, true, true, false, true, true, true, false};
//        boolean[] c = new boolean[]{false, false, false, true, false, false, false, true};
//
//        System.out.println(longestString.arraySearch(3, a, b, c));
//        System.out.println(longestString.arraySearch(2, a, b, c));
//        System.out.println(longestString.arraySearch(1, a, b, c));


        boolean[][] res = longestString.getCharBitArrays("pwwkew");
        for (int i = res.length ; i >0 ; i --) {
            boolean result = longestString.arraySearch(i, res);
            if (result == true){
                System.out.println(i);
                break;
            }
        }
    }
}